package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.PageVo;
import com.itheima.admin.dto.ModuleDto;
import com.itheima.admin.mapper.ModuleMapper;
import com.itheima.admin.pojo.Module;
import com.itheima.admin.service.IModuleService;
import com.itheima.admin.vo.ModuleListVo;
import com.itheima.admin.vo.ModuleVo;
import com.itheima.admin.vo.QModuleVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ModuleServiceImpl implements IModuleService {

    @Autowired
    private ModuleMapper moduleMapper;

    private List<ModuleVo> getVos(List<Module> modules) {
        if (modules == null){
            return new ArrayList<>();
        }
        //List<Role> ==> List<RoleVo>
        return modules.stream().map(
                module -> {
                    ModuleVo moduleVo = new ModuleVo();
                    BeanUtils.copyProperties(module, moduleVo);
                    //设置ctype
                    if (module.getCtype().equals(0)){
                        moduleVo.setCtype("主菜单");
                    } else if (module.getCtype().equals(1)){
                        moduleVo.setCtype("左侧菜单");
                    } else if (module.getCtype().equals(2)){
                        moduleVo.setCtype("按钮");
                    } else if (module.getCtype().equals(3)){
                        moduleVo.setCtype("链接");
                    } else if (module.getCtype().equals(4)){
                        moduleVo.setCtype("状态");
                    } else {
                        moduleVo.setCtype("");
                    }
                    //设置state
                    if (module.getState().equals(1)){
                        moduleVo.setState("启用");
                    } else {
                        moduleVo.setState("停用");
                    }

                    return moduleVo;
                }
        ).collect(Collectors.toList());
    }

    @Override
    public PageVo<ModuleVo> queryByPage(ModuleDto moduleDto) {

        Page<Module> page = new Page<>(moduleDto.getCurrentPage(),moduleDto.getPageSize());
        QueryWrapper<Module> queryWrapper = new QueryWrapper<>();
        if (moduleDto.getName()!=null){
            queryWrapper.like("name",moduleDto.getName());
        }
        if (moduleDto.getCtype()!=null){
            queryWrapper.eq("ctype",moduleDto.getCtype());
        }
        IPage<Module> modulePage = moduleMapper.selectPage(page,queryWrapper);

        //List<Module> ==> List<ModuleVo>
        List<ModuleVo> collect = getVos(modulePage.getRecords());

        return new PageVo<>(collect,(int)modulePage.getTotal());
    }

    @Override
    public QModuleVo queryById(String moduleId) {
        Module module = moduleMapper.selectById(moduleId);
        QModuleVo queryResult = new QModuleVo();
        BeanUtils.copyProperties(module,queryResult);
        return queryResult;
    }

    @Override
    public boolean addModule(QModuleVo qModuleVo) {

        Module module = new Module();
        BeanUtils.copyProperties(qModuleVo,module);

        return moduleMapper.insert(module) > 0;
    }

    @Override
    public boolean deleteModule(String moduleId) {

        return moduleMapper.deleteById(moduleId) > 0;

    }

    @Override
    public boolean editModule(QModuleVo qModuleVo) {
        Module module = new Module();
        BeanUtils.copyProperties(qModuleVo,module);

        return moduleMapper.updateById(module) > 0;
    }

    //通过递归的方法查询所有模块的子集模块
    public List<ModuleListVo> getChildrenList(String parentId){
        QueryWrapper<Module> query = Wrappers.<Module>query();
        query.eq("parent_id",parentId);
        List<Module> modules = moduleMapper.selectList(query);

        if(modules==null){
            return null;
        }

        return modules.stream().map(
                module -> {
                    ModuleListVo ml = new ModuleListVo();
                    ml.setId(module.getModuleId());
                    ml.setLabel(module.getName());
                    ml.setChildren(getChildrenList(module.getModuleId()));
                    return ml;
                }
        ).collect(Collectors.toList());
    }


    @Override
    public List<ModuleListVo> queryAllModules() {
       return getChildrenList("1");
    }

}
